<?php
/**
 * @ClassName: Juheapi
 * @Description: TODO
 * @author: gydtrade
 * @Date: 2025-10-11 17:54
 * @Version: V1.0.0
 */

namespace app\api\controller;

class Juheapi extends Api
{
    /**
     * 识别证件入口:统一入口
     * @return \think\response\Json
     */
    function doImg()
    {
        // 1 依赖,没有依赖不用管

        // 2 接收参数,并验证
        $file = input("file"); // 当前系统图片路径
        $cardType = input("cardType/d", 0); // 识别类型
        if (!$file) {
            return json(["code" => 0, "msg" => "识别失败:缺少证件地址"]);
        }
        if (!$cardType) {
            return json(["code" => 0, "msg" => "识别失败:缺少识别类型"]);
        }

        /**
         * cardType 识别类型
         * 1 一代身份证
         * 2 二代身份证正面
         * 3 二代身份证证背面
         * 17 银行卡
         * 2008 营业执照
         */
        $type = [1, 2, 3, 17, 2008]; // 只识别这几种
        if (!in_array($cardType, $type)) {
            return json(["code" => 0, "msg" => "识别失败:不识别该类型证件"]);
        }

        // 3 处理数据
        // 3.1 调接口做识别
        $res = $this->doCardAll($file, $cardType);
        if (!$res["code"]) {
            return json(["code" => 0, "msg" => "识别失败:" . $res["msg"]]);
        }
        $data = $res["data"];

        // 3.2 处理数据格式
        if ($cardType == 2008) { // 营业执照识别
            $data = $this->resetLicense($data);
        }

        // 4 返回
        return json(["code" => 1, "msg" => "识别成功", "data" => $data]);
    }

    /**
     * 识别证件:统一接口
     * @param $file
     * @param $cardType
     * @return array
     */
    protected function doCardAll($file, $cardType)
    {
        // 没有缓存，在线识别
        $juheUrl = "http://v.juhe.cn/certificates/query.php";

        // $file = input("file"); // 当前系统图片路径

        /**
         * cardType 识别类型
         * 1 一代身份证
         * 2 二代身份证正面
         * 3 二代身份证证背面
         * 17 银行卡
         * 2008 营业执照
         */

        if (strpos($file, "http") > -1) {
            $file = str_replace(domain() . "/", "", $file);
        }

        // 文件全地址
        $full_path = env('root_path') . 'public' . $file;

        // 转culr 文件对象
        $fileObj = curl_file_create($full_path, 'image/jpeg', 'test_name');

        // 转base64，md5加密，当成缓存键
        $file_base64 = $this->base64EncodeImage("./" . $file);

        // 加密后当成key,确保同一张图片不识别多次
        $md5 = MD5($file_base64);

        // 缓存键
        $cache_idcard_key = "cahce_" . $this->member_id . "_doIdCardFubei_" . $md5;

        // 读取缓存
        $cacheData = cache($cache_idcard_key);

        // 图片识别过
        if ($cacheData) {
            return ['code' => 1, "msg" => "获取缓存图片识别信息", "data" => $cacheData];
        }

        // 请求参数
        $params = array(
            'key' => '84aab5c8cc6c3875b222ca32ef5e23f1',
            'cardType' => $cardType,
            'pic' => $fileObj,//MultipartFile上传图片,大小限制在3M以内(一般建议200k以下)
        );

        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $juheUrl);

        curl_setopt($ch, CURLOPT_POST, 1);

        curl_setopt($ch, CURLOPT_HEADER, 0);

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        curl_setopt($ch, CURLOPT_POSTFIELDS, $params);

        $return = curl_exec($ch);

        curl_close($ch);

        $res = json_decode($return, true);

        // 判断是否请求成功
        if (isset($res["reason"]) && $res["reason"] != "操作成功") {
            return ['code' => 0, "msg" => "识别失败:" . $res["reason"]];
        }

        $data = $res["result"];

        // 缓存24小时，避免同一张图片多次识别
        cache($cache_idcard_key, $data, 60 * 60 * 24);

        // 识别成功，返回
        return ['code' => 1, "msg" => "识别成功", "data" => $data];
    }

    /**
     * 处理营业执照数据
     * @param $oldData
     * @return array
     */
    protected function resetLicense($oldData)
    {
        $data = [];
        $data["license_code"] = $oldData["统一社会信用代码"];
        $data["license_name"] = $oldData["名称"];

        if (isset($oldData["经营场所"])) {
            $data["license_address"] = $oldData["经营场所"];
        } else {
            $data["license_address"] = $oldData["住所"];
        }

        if (isset($oldData["注册日期"])) {
            $data["license_time_start"] = $oldData["注册日期"];
        } else {
            $data["license_time_start"] = $oldData["成立日期"];
        }

        $data["license_time_end"] = $oldData["营业期限"];

        // 处理日期格式
        $data["license_time_start"] = $this->getDateStr2($data["license_time_start"]);

        $data["license_time_long"] = 0; // 标记是否是长期:否
        if (!$data["license_time_end"]) {
            $data["license_time_long"] = 1; // 标记是否是长期:是
        } else {
            $data["license_time_end"] = $this->getDateStr2($data["license_time_end"]);
        }

        return $data;
    }

    /**
     * 转base64
     * @param $image_file
     * @return string
     */
    protected function base64EncodeImage($image_file)
    {
        $base64_image = '';

        $image_info = getimagesize($image_file);

        $image_data = fread(fopen($image_file, 'r'), filesize($image_file));

        $base64_image = 'data:' . $image_info['mime'] . ';base64,' . chunk_split(base64_encode($image_data));

        $base64_image2 = chunk_split(base64_encode($image_data));

        return $base64_image2;
    }

    /**
     * 将带中文的日期转换成不带中文
     * @param $date
     * @param $is_str
     * @return false|string
     */
    protected function getDateStr2($date, $is_str = 1)
    {
        if (strpos($date, "长期") > -1) {
            $date = date("Y-m-d", strtotime("15 year"));
            return $date;
        }

        if ($is_str) {
            $year = substr($date, 0, 4);
            $month = substr($date, 7, 2);
            $day = substr($date, 12, 2);
            $date = $year . "-" . $month . "-" . $day;
        } else {
            $date = date("Y-m-d", strtotime($date));
        }

        return $date;
    }

}